package question06;

/**
 * @author yuan
 * @date 2021/12/14
 */
// 高消耗
/**
 * 问题：
 *      给定字符串 s 根据给定的行数 numRows ，以从上往下、从左到右进行 Z 字形排列，并输出该字符串
 * 思路：
 *      1、将字符串按 Z 规律，放入二维数组中，最后按顺序遍历二维数组，将空格符去掉即可
 *      2、通过分析，二维数组的高即为 numRows，而二维数组的宽具有一定的规律性
 *      (s.length() / numRows + 1) + (numRows - 2) * ((s.length() / numRows + 1) - 1)
 *      放 Z 字形上下两条横所占的行数 + 夹在 Z 字形上下两条横中间所占的行数
 *      3、定义 x 坐标，y 坐标，从左往右依次填充，根据 y 坐标的值判断 x 是否从 0 到 numRows 都需要填充，
 *      x++，一直加到 = numRows，说明这一列已添加满，则需要另换一列进行填充 x--，y++
 *      对应关系为 y % (numRows - 1) == 0，如果 y 不满足该条件，说明填充的是 Z 字形的斜线，则一列只需要
 *      填写一个字符即可，并向右上角 45° 移动，x--，y++
 */
public class Solution {
    public static void main(String[] args) {
        // System.out.println(new Solution().convert("PAYPALISHIRING", 3));
        // System.out.println(new Solution().convert("PAYPALISHIRING", 4));
        // System.out.println(new Solution().convert("A", 1));
        // System.out.println(new Solution().convert("A", 5));
        // System.out.println(new Solution().convert("AB", 2));
        // System.out.println(new Solution().convert("ABC", 2));
        System.out.println(new Solution().convert("ABCD", 3));
    }


    /**
     * 给定字符串 s 根据给定的行数 numRows ，以从上往下、从左到右进行 Z 字形排列，并输出该字符串
     *
     * @param s
     * @param numRows
     * @return
     */
    public String convert(String s, int numRows) {

        if (numRows == 1) return s;
        if (s.length() < numRows) return s;
        // 将字符串全部保留至二维数组中
        // 计算二维数组宽
        int width = (s.length() / numRows + 1) + (numRows - 2) * ((s.length() / numRows + 1) - 1);
        char[][] array = new char[numRows][width];
        // x 坐标
        int x = 0;
        // y 坐标
        int y = 0;
        // 将字符串转换为数组
        char[] toCharArray = s.toCharArray();
        // 存储转化后的字符串
        StringBuilder stringBuilder = new StringBuilder();
        for (char c : toCharArray) {
            array[x][y] = c;
            // 说明这一列必须全部填满
            if (y % (numRows - 1) == 0){
                // 从上到下移动
                if (x != numRows - 1) x++;
                // 重新换一列
                else {
                    x--;
                    y++;
                }
            }else {
                // 不必填满，向右上角移动
                x--;
                y++;
            }

        }
        for (char[] chars : array) {
            stringBuilder.append(String.valueOf(chars));
        }
        return stringBuilder.toString().replace("\0","");
    }
}
